cssvalue: Convert border-image-width to border value
authorBenjamin Otte <otte@redhat.com>
Wed, 4 Apr 2012 15:42:45 +0000 (17:42 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 17 Apr 2012 06:59:19 +0000 (08:59 +0200)
gtk/gtkborderimage.c
gtk/gtkborderimageprivate.h
gtk/gtkcssnumbervalue.c
gtk/gtkcssnumbervalueprivate.h
gtk/gtkcssshorthandpropertyimpl.c
gtk/gtkcssstylepropertyimpl.c

index f75d7e0e4e34bcce5da803ba66a478e18a71855d..337dba3f47938b94f13a6d871c99643dfd26f5b2 100644 (file)
@@ -41,22 +41,12 @@ gboolean
 _gtk_border_image_init (GtkBorderImage   *image,
                         GtkThemingEngine *engine)
 {
-  GtkBorder *width;
-
   image->source = _gtk_css_image_value_get_image (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE));
   if (image->source == NULL)
     return FALSE;
 
   image->slice = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE);
-  width = _gtk_css_value_get_boxed (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH));
-  if (width)
-    {
-      image->width = *width;
-      image->has_width = TRUE;
-    }
-  else
-    image->has_width = FALSE;
-
+  image->width = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH);
   image->repeat = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT);
 
   return TRUE;
@@ -69,20 +59,38 @@ struct _GtkBorderImageSliceSize {
 };
 
 static void
-gtk_border_image_compute_border_size (GtkBorderImageSliceSize sizes[3],
-                                      double                  offset,
-                                      double                  area_size,
-                                      int                     start_border,
-                                      int                     end_border)
+gtk_border_image_compute_border_size (GtkBorderImageSliceSize  sizes[3],
+                                      double                   offset,
+                                      double                   area_size,
+                                      int                      start_border_width,
+                                      int                      end_border_width,
+                                      const GtkCssValue       *start_border,
+                                      const GtkCssValue       *end_border)
 {
-  /* This code assumes area_size >= start_border + end_border */
+  double start, end;
+
+  if (_gtk_css_number_value_get_unit (start_border) == GTK_CSS_NUMBER)
+    start = start_border_width * _gtk_css_number_value_get (start_border, 100);
+  else
+    start = _gtk_css_number_value_get (start_border, area_size);
+  if (_gtk_css_number_value_get_unit (end_border) == GTK_CSS_NUMBER)
+    end = end_border_width * _gtk_css_number_value_get (end_border, 100);
+  else
+    end = _gtk_css_number_value_get (end_border, area_size);
+
+  /* XXX: reduce vertical and horizontal by the same factor */
+  if (start + end > area_size)
+    {
+      start = start * area_size / (start + end);
+      end = end * area_size / (start + end);
+    }
 
   sizes[0].offset = offset;
-  sizes[0].size = start_border;
-  sizes[1].offset = offset + start_border;
-  sizes[1].size = area_size - start_border - end_border;
-  sizes[2].offset = offset + area_size - end_border;
-  sizes[2].size = end_border;
+  sizes[0].size = start;
+  sizes[1].offset = offset + start;
+  sizes[1].size = area_size - start - end;
+  sizes[2].offset = offset + area_size - end;
+  sizes[2].size = end;
 }
 
 static void
@@ -240,9 +248,6 @@ _gtk_border_image_render (GtkBorderImage   *image,
   double source_width, source_height;
   int h, v;
 
-  if (image->has_width)
-    border_width = &image->width;
-
   _gtk_css_image_get_concrete_size (image->source,
                                     0, 0,
                                     width, height,
@@ -266,12 +271,16 @@ _gtk_border_image_render (GtkBorderImage   *image,
                                         x,
                                         width,
                                         border_width->left,
-                                        border_width->right);
+                                        border_width->right,
+                                        _gtk_css_border_value_get_left (image->width),
+                                        _gtk_css_border_value_get_right (image->width));
   gtk_border_image_compute_border_size (vertical_border,
                                         y,
                                         height,
                                         border_width->top,
-                                        border_width->bottom);
+                                        border_width->bottom,
+                                        _gtk_css_border_value_get_top (image->width),
+                                        _gtk_css_border_value_get_bottom(image->width));
   
   for (v = 0; v < 3; v++)
     {
index f57149ccfec7477c0f3a51fcb4e20af393d91e50..65ed8dd468deac779befac29e33d26b99346f230 100644 (file)
@@ -35,8 +35,7 @@ struct _GtkBorderImage {
   GtkCssImage *source;
 
   GtkCssValue *slice;
-  gboolean has_width;
-  GtkBorder width;
+  GtkCssValue *width;
   GtkCssValue *repeat;
 };
 
index e7c04d9d383f3ceaba70c720e0b363cdf2f75ed8..531942bca3f81fc4f28beea59334b7e687cba5fd 100644 (file)
@@ -141,6 +141,14 @@ _gtk_css_number_value_parse (GtkCssParser           *parser,
   return _gtk_css_number_value_new (number.value, number.unit);
 }
 
+GtkCssUnit
+_gtk_css_number_value_get_unit (const GtkCssValue *value)
+{
+  g_return_val_if_fail (value->class == &GTK_CSS_VALUE_NUMBER, GTK_CSS_NUMBER);
+
+  return value->unit;
+}
+
 double
 _gtk_css_number_value_get (const GtkCssValue *number,
                            double             one_hundred_percent)
index a864d44e01354e9cbecee5749d1a5f63014dc0a5..965b06d98e1a0fc1356190f81436565a3ea4ef18 100644 (file)
@@ -31,6 +31,7 @@ GtkCssValue *   _gtk_css_number_value_new           (double                  val
 GtkCssValue *   _gtk_css_number_value_parse         (GtkCssParser           *parser,
                                                      GtkCssNumberParseFlags  flags);
 
+GtkCssUnit      _gtk_css_number_value_get_unit      (const GtkCssValue      *value);
 double          _gtk_css_number_value_get           (const GtkCssValue      *number,
                                                      double                  one_hundred_percent);
 GtkCssValue *   _gtk_css_number_value_compute       (GtkCssValue            *number,
index 3a26a28afdeb5236bf1492dbf81275d2d63ba661..03d84e8c836b62c4ba70d484f8f21417855238ec 100644 (file)
@@ -34,9 +34,7 @@
 #include "gtkcssrepeatvalueprivate.h"
 #include "gtkcssstringvalueprivate.h"
 #include "gtkcssstylefuncsprivate.h"
-#include "gtkcsstypesprivate.h"
 #include "gtkcssvalueprivate.h"
-#include "gtkprivatetypebuiltins.h"
 #include "gtkstylepropertiesprivate.h"
 #include "gtksymboliccolorprivate.h"
 #include "gtktypebuiltins.h"
@@ -316,13 +314,15 @@ parse_border_image (GtkCssShorthandProperty  *shorthand,
 
           if (_gtk_css_parser_try (parser, "/", TRUE))
             {
-              GValue value = G_VALUE_INIT;
-
-              g_value_init (&value, GTK_TYPE_BORDER);
-              if (!_gtk_css_style_parse_value (&value, parser, base))
+              values[2] = _gtk_css_border_value_parse (parser,
+                                                       GTK_CSS_PARSE_PERCENT
+                                                       | GTK_CSS_PARSE_LENGTH
+                                                       | GTK_CSS_PARSE_NUMBER
+                                                       | GTK_CSS_POSITIVE_ONLY,
+                                                       TRUE,
+                                                       FALSE);
+              if (values[2] == NULL)
                 return FALSE;
-              values[2] = _gtk_css_value_new_from_gvalue (&value);
-              g_value_unset (&value);
             }
         }
       else
index 530a85ec3c8cc8a7e7391c4d3f8ffb658391858c..dab9abd4994905f75364c7cb3cd1425c546ad2d0 100644 (file)
@@ -729,20 +729,13 @@ border_image_width_parse (GtkCssStyleProperty *property,
                           GtkCssParser        *parser,
                           GFile               *base)
 {
-  GValue value = G_VALUE_INIT;
-  GtkCssValue *result;
-
-  g_value_init (&value, GTK_TYPE_BORDER);
-  if (!_gtk_css_style_parse_value (&value, parser, base))
-    {
-      g_value_unset (&value);
-      return NULL;
-    }
-
-  result = _gtk_css_value_new_from_gvalue (&value);
-  g_value_unset (&value);
-
-  return result;
+  return _gtk_css_border_value_parse (parser,
+                                      GTK_CSS_PARSE_PERCENT
+                                      | GTK_CSS_PARSE_LENGTH
+                                      | GTK_CSS_PARSE_NUMBER
+                                      | GTK_CSS_POSITIVE_ONLY,
+                                      TRUE,
+                                      FALSE);
 }
 
 static GtkCssValue *
@@ -1543,11 +1536,14 @@ _gtk_css_style_property_init_properties (void)
                                           0,
                                           border_image_width_parse,
                                           NULL,
+                                          compute_border,
+                                          query_border,
+                                          assign_border,
                                           NULL,
-                                          query_simple,
-                                          assign_simple,
-                                          NULL,
-                                          _gtk_css_value_new_from_boxed (GTK_TYPE_BORDER, NULL));
+                                          _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
+                                                                     _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
+                                                                     _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
+                                                                     _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
 
   gtk_css_style_property_register        ("transition-property",
                                           GTK_CSS_PROPERTY_TRANSITION_PROPERTY,